;@ Fonctions utiles
.section .text
.globl GetSPVStackBase
GetSPVStackBase:
	ldr r0, =0x80000
	mov pc, lr
;@
;@ Configurer une variable
;@ void Set32(unsigned int add, int val)
.globl Set32
Set32:
	str r1, [r0]
	mov pc, lr
;@
;@ Obtenir la valeur d'un registre
;@ int Get32(unsigned int add)
.globl Get32
Get32:
	ldr r0, [r0]
	mov pc, lr
;@
;@ Lancement de la MMU
;@ void StartMMU(unsigned int table_base_add)
.globl StartMMU
StartMMU:
	;@ On configure TTBR0, l'adresse de la table des page est dans r0
	orr r0, r0, #25  ;@ normal memory outer-cacheable write-back
					 ;@ beyound level 1 AND shared AND inner-cacheable
	mcr p15, 0, r0, c2, c0, 0
	;@ On configure la table des pages sur TTBR0
	mov r0, #0
	mcr p15, 0, r0, c2, c0, 2
	;@ On désactive les caches
	mov r0, #0
	mcr p15, 0, r0, c1, c0, 0
	;@ Invalidation du cache (données et instructions)
	mcr p15, 0, r0, c7, c7, 0
	;@ Invalidation des entrées TLB actuelles
	mcr p15, 0, r0, c8, c7, 0
	;@ On configure le domain access control
	ldr r0, =1431655765
	mcr p15, 0, r0, c3, c0, 0
	;@ On active la MMU, et d'autres trucs
	ldr r0, =75864189
	mcr p15, 0, r0, c1, c0, 0
	mov pc, lr
;@
;@ Code de lancement
.section .init
init:
	;@ On configure la stack du supervisor
	bl GetSPVStackBase
	mov sp, r0
	bl kmain
